#include <iostream>
#include <string>

// 模板的局限性
// 模板并不是万能的，有些特定数据类型，需要用具体化方式作特殊实现


class Person
{
public:
    Person(std::string name, int age) 
    {
        this->m_Name = name;
        this->m_Age  = age;
    }

    std::string m_Name;
    int    m_Age;
};

// template<>
// class Person<int>
// {
// public:
//     Person(int id)
//         : id(id) {}

//     int id;)
// }


// 对比两个数据是否相等
template<typename T>
bool myCompare(T &a, T &b)
{
    if (a == b) {
        return true;
    } else {
        return false;
    }
}


// 利用具体化Person的版本实现代码，具体优化先调用
template<> bool myCompare(Person &p1, Person &p2)
{
    if (p1.m_Name == p2.m_Name && p1.m_Age == p2.m_Age){
        return true;
    } else {
        return false;
    }
}

// void test01()
// {
//     int a = 10;
//     int b = 10;
//     std::cout << myCompare(a, b) << std::endl; // true

//     double c = 10.0;
//     double d = 10.0;
//     std::cout << myCompare(c, d) << std::endl; // true

//     char e = 'a';
//     char f = 'a';
//     std::cout << myCompare(e, f) << std::endl; // true

//     std::string g = "hello";
//     std::string h = "hello";
//     std::cout << myCompare(g, h) << std::endl; // true
// }


void test02()
{
    Person p1("Tom", 10);
    Person p2("Tom", 10);

    bool ret = myCompare(p1, p2);
    if (ret) {
        std::cout << "p1 == p2" << std::endl;
    } else {
        std::cout << "p1 != p2" << std::endl;
    }
}

int main()
{
    test02();    
    return 0;
}